/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */
#ifndef PERIPHERAL_API_H
#define PERIPHERAL_API_H
#include <stdint.h>

// 最大的摄像头数量.
#define HIAI_MAX_CAMERA_COUNT (25)

// 最大的MIC数量.
#define HIAI_MAX_MIC_COUNT (25)

// 摄像头支持的分辨率组合的最大数量.
#define HIAI_MAX_CAMERARESOLUTION_COUNT (25)

enum LIBMEDIA_STATUS {
    LIBMEDIA_STATUS_FAILED = 0,
    LIBMEDIA_STATUS_OK,
};

int MediaLibInit();

// 查询芯片是否可以连通.
// chipName  芯片名称.
// 存在返回1，否则返回0
// 示例:
// IsChipAlive "3559" //< 检测3559芯片是否在位.
int IsChipAlive(char *chipName);

// 查询摄像头通道
// 返回所有的摄像头ID信息。
// cameraIds 用于保存camera id。
// count  cameraIds 的长度。最多HIAI_MAX_CAMERA_COUNT个.
// 返回摄像头通道数量，摄像头id存入cameraIds中.
uint32_t QueryCameraIds(int *cameraIds, uint32_t *count);

// 2. 查询摄像头状态.
enum CameraStatus {
    CAMERA_STATUS_OPEN = 1,    // 摄像头处于打开状态
    CAMERA_STATUS_CLOSED = 2,  // 摄像头处于关闭状态
    CAMERA_NOT_EXISTS = 3,     // 该摄像头不存在
    CAMERA_STATUS_UNKOWN = 4,  // 摄像头状态未知
};

enum CameraStatus QueryCameraStatus(int cameraId);

// 打开摄像头
// 打开成功返回1，否则返回0.
int OpenCamera(int cameraId);

// 设置摄像头参数
enum CameraProperties {
    CAMERA_PROP_RESOLUTION = 1,    // 【Read/Write】分辨率  数据类型 CameraResolution* 长度为1
    CAMERA_PROP_FPS = 2,           // 【Read/Write】帧率, 数据类型为uint32_t
    CAMERA_PROP_IMAGE_FORMAT = 3,  // 【Read/Write】帧图片的格式.  数据类型为CameraImageFormat
    // 【Read】用于获取摄像头支持的所有的分辨率列表.数据类型为CameraResolution*, 数组长度为HIAI_MAX_CAMERARESOLUTION_COUNT
    CAMERA_PROP_SUPPORTED_RESOLUTION = 4,
    CAMERA_PROP_CAP_MODE = 5,    // 【Read/Write】帧数据获取的方式，主动或者被动.数据类型为CameraCapMode
    CAMERA_PROP_BRIGHTNESS = 6,  // 【Read/Write】亮度，数据类型为uint32_t
    CAMERA_PROP_CONTRAST = 7,    // 【Read/Write】对比度，数据类型为uint32_t
    CAMERA_PROP_SATURATION = 8,  // 【Read/Write】饱和度，数据类型为uint32_t
    CAMERA_PROP_HUE = 9,         // 【Read/Write】色调，数据类型为uint32_t
    CAMERA_PROP_GAIN = 10,       // 【Read/Write】增益，数据类型为uint32_t
    CAMERA_PROP_EXPOSURE = 11,   // 【Read/Write】曝光，数据类型为uint32_t
};

// 摄像头图片格式
enum CameraImageFormat {
    CAMERA_IMAGE_YUV420_SP = 1,
};

// 摄像头数据获取模式
enum CameraCapMode {
    CAMERA_CAP_ACTIVE = 1,   // 主动模式.
    CAMERA_CAP_PASSIVE = 2,  // 被动模式.
};

// 分辨率.
struct CameraResolution {
    int width;
    int height;
};

// 设置摄像头参数.
// 设置成功返回1，否则返回0
int SetCameraProperty(int cameraId, enum CameraProperties prop, const void *pInValue);

// 获取摄像头参数.
// 获取成功返回1，否则返回0
int GetCameraProperty(int cameraId, enum CameraProperties prop, void *pValue);

// 获取摄像头数据.
// 执行成功返回1，否则返回0
typedef int (*CAP_CAMERA_CALLBACK)(const void *pdata, int size, void *param);

// 被动采样Camera
// 执行成功返回1， 否则返回0.
int CapCamera(int cameraId, CAP_CAMERA_CALLBACK, void *param);

// 主动采样Camera
// 从摄像头读取一帧图片内容.
// 执行成功返回1， 否则返回0.
int ReadFrameFromCamera(int cameralId, void *pdata, int *size);

// 关闭摄像头
// 打开成功返回1，否则返回0.
int CloseCamera(int cameraId);

// //////////////////////////////////////////////////
//     MIC  Interace
// /////////////////////////////////////////////////
// 摄像头数据获取模式
enum MICCapMode {
    MIC_CAP_ACTIVE = 1,   // 主动模式.
    MIC_CAP_PASSIVE = 2,  // 被动模式.
};

enum AudioSampleRate {
    MIC_AUDIO_SAMPLE_RATE_8000 = 8000,   /* 8K samplerate */
    MIC_AUDIO_SAMPLE_RATE_12000 = 12000, /* 12K samplerate */
    MIC_AUDIO_SAMPLE_RATE_11025 = 11025, /* 11.025K samplerate */
    MIC_AUDIO_SAMPLE_RATE_16000 = 16000, /* 16K samplerate */
    MIC_AUDIO_SAMPLE_RATE_22050 = 22050, /* 22.050K samplerate */
    MIC_AUDIO_SAMPLE_RATE_24000 = 24000, /* 24K samplerate */
    MIC_AUDIO_SAMPLE_RATE_32000 = 32000, /* 32K samplerate */
    MIC_AUDIO_SAMPLE_RATE_44100 = 44100, /* 44.1K samplerate */
    MIC_AUDIO_SAMPLE_RATE_48000 = 48000, /* 48K samplerate */
    MIC_AUDIO_SAMPLE_RATE_64000 = 64000, /* 64K samplerate */
    MIC_AUDIO_SAMPLE_RATE_96000 = 96000, /* 96K samplerate */
    MIC_AUDIO_SAMPLE_RATE_BUTT,
};

enum AudioSampleNumPerFrame {
    MIC_SAMPLE_NUM_80 = 80,
    MIC_SAMPLE_NUM_160 = 160,
    MIC_SAMPLE_NUM_240 = 240,
    MIC_SAMPLE_NUM_320 = 320,
    MIC_SAMPLE_NUM_480 = 480,
    MIC_SAMPLE_NUM_1024 = 1024,
    MIC_SAMPLE_NUM_2048 = 2048,
};

enum AudioBitWidth {
    MIC_AUDIO_BIT_WIDTH_16 = 1, /* 16bit width */
    MIC_AUDIO_BIT_WIDTH_24 = 2, /* 24bit width */
    MIC_AUDIO_BIT_WIDTH_BUTT,
};

enum AudioMode {
    MIC_AUDIO_SOUND_MODE_MONO = 0,   /* mono */
    MIC_AUDIO_SOUND_MODE_STEREO = 1, /* stereo */
    MIC_AUDIO_SOUND_MODE_BUTT
};

struct MICProperties {
    enum AudioSampleRate sample_rate;               // 【Read/Write】采样率, 数据类型为uint32_t
    enum MICCapMode cap_mode;                       // 【Read/Write】MIC捕获声音的模式
    enum AudioBitWidth bit_width;                   // 【Read/Write】每个样本的bit位宽
    enum AudioSampleNumPerFrame frame_sample_rate;  // 【Read/Write】每帧的样本数量
    enum AudioMode sound_mode;                      // 【Read/Write】单声道还是立体声.
};

enum MICStatus {
    MIC_STATUS_OPEN = 1,    // MIC处于打开状态
    MIC_STATUS_CLOSED = 2,  // MIC处于关闭状态
    MIC_NOT_EXISTS = 3,     // MIC不存在
    MIC_STATUS_UNKOWN = 4,  // MIC状态未知
};

enum MICStatus QueryMICStatus();

// 打开 MIC
int OpenMIC();

// 设置MIC 属性.
int SetMICProperty(struct MICProperties *propties);

// 获取MIC 属性.
int GetMICProperty(struct MICProperties *propties);

typedef int (*CAP_MIC_CALLBACK)(const void *pdata, int size, void *param);

// 被动采样MIC
int CapMIC(CAP_MIC_CALLBACK, void *param);

// 主动采样模式时，用户态程序调用该接口从MIC设备读取音频数据
// 如果读取数据时，MIC设备的数据还没有采样完整，则阻塞用户态应用程序直到一帧数据接收完整
// 约定：采用memory copy方式向用户传递数据
// pdata 用户态buffer，用户需要准备足够长的buffer来保存一帧音频数据的长度
// size 用户态buffer的大小,执行成功后，返回实际数据长度
// 执行成功返回1， 否则返回0.
int ReadMicSound(void *pdata, int *size);

// 关闭MIC
int CloseMIC();

#endif
